package models.weixin.auth;

import helper.GlobalConfig;
import jodd.util.StringUtil;
import models.merchant.Merchant;
import models.weixin.WebUser;
import org.apache.commons.lang.StringUtils;
import play.Logger;
import play.Play;
import play.mvc.After;
import play.mvc.Before;
import play.mvc.Controller;
import shopcart.ShopCart;
import util.common.ConvertUtil;
import util.common.RandomNumberUtil;

/**
 * 微信公众号认证，基于OAuth.
 */
public class WxPCAuth extends Controller {


    private final static ThreadLocal<WebUser> _currentUser = new ThreadLocal<>();
    private final static ThreadLocal<Merchant> _currentMerchant = new ThreadLocal<>();


    /**
     * 检查是否已经OAuth认证过，如果没有，则调用认证.
     * @throws Throwable
     */
    @Before(unless = {"login", "logout", "fail", "validate", "validation", "authenticate", "captcha"})
    public static void filter() throws Throwable {
        String webUserId = session.get(GlobalConfig.WEIXIN_MP_WEIXIN_SESSION_USER_ID);
        Long count = 0l;
        Logger.info("LOG  PC_10001   webUserId : %s" , webUserId);
        if(StringUtil.isNotBlank(webUserId)) {
            WebUser webUser = currentUser();
            Logger.info("LOG  PC_10002   webUser : %s" , webUser);
            if(webUser == null) {
                webUser = WebUser.findByUserId(Long.valueOf(webUserId));
                _currentUser.set(webUser);
            }
            Logger.info("LOG  PC_10003   _currentUser : %s" , currentUser());
            renderArgs.put("webUser", webUser);
        }
        if(currentUser() != null) {
            count = ShopCart.findShopCartSize(currentUser(), ConvertUtil.toLong(currentMerchant().id));

        }
        renderArgs.put("shopcartCount" , count);
        String uuid = RandomNumberUtil.generateRandomNumberString(16);
        String rqcodePath = "http://ulcweixin.ulmsale.net/388458?uuid="+ uuid;
        renderArgs.put("rqcodePath" , rqcodePath);
        renderArgs.put("uuid" , uuid);
    }


    @After
    public static void cleanCurrentUser() {
        _currentUser.remove();
    }

    /**
     * 在Controller中使用WexinCpAuth可以得到当前用户.
     */
    public static Merchant currentMerchant() {
        if(_currentMerchant.get()==null){
            Merchant merchant = Merchant.findByLinkId("388458");
            _currentMerchant.set(merchant);
        }
        return _currentMerchant.get();
    }

    /**
     * 在Controller中使用WexinCpAuth可以得到当前用户.
     */
    public static WebUser currentUser() {
        return _currentUser.get();
    }

    /**
     * 在Controller中使用WexinCpAuth可以得到当前用户.
     * 该用户为数据库用户. 从数据库仲更新数据
     */
    public static WebUser currentUpdateUser() {
        WebUser cacheUser = _currentUser.get();
        return WebUser.findById(cacheUser.id);
    }


    public static void logout() {
//        String sessionUserId = session.get(GlobalConfig.WEIXIN_MP_WEIXIN_SESSION_USER_KEY + merchant.weixinData.id);
        String sessionUserId = session.get(GlobalConfig.WEIXIN_MP_WEIXIN_SESSION_USER_ID);
        if(StringUtils.isNotBlank(sessionUserId)) {
            session.remove(GlobalConfig.WEIXIN_MP_WEIXIN_SESSION_USER_ID);
            cleanCurrentUser();
        }
        session.clear();
    }

    /**
     * 检查是否要跳过认证检查.
     *
     * @return 返回true表明跳过检查.
     */
    private static boolean skipAuthCheck() {
        if (getActionAnnotation(SkipAuth.class) != null ||
                getControllerInheritedAnnotation(SkipAuth.class) != null) {
            Logger.info("skipAuthCheck=true");
            return true;
        }
        Logger.info("skipAuthCheck=false");
        return false;
    }

    /**
     * 检查是否要使用JSAPI.
     *
     * 在类名或方法上使用@UseJsAPI标注，会在renderArgs中加入一个jsSignature的对象.
     *
     * @return UseJsAPI，其value指定需要的权限.
     */
    private static UseJsApi getUseJsAPI() {
        if (getActionAnnotation(UseJsApi.class) != null) {
            Logger.info("UseJsAPI on Action");
            return getActionAnnotation(UseJsApi.class);
        }
        if (getControllerInheritedAnnotation(UseJsApi.class) != null) {
            Logger.info("UseJsAPI on Controller");
            return getControllerInheritedAnnotation(UseJsApi.class);
        }
        Logger.info("UseJsAPI=false");
        return null;
    }

}
